package main

import (
	"fmt"
	"time"
)

// 当向通道中发送完数据时，我们可以通过close函数来关闭通道。
// 关闭 channel 非常简单，直接使用Go语言内置的 close() 函数即可,关闭后的通道只可读不可写。
func main() {
	ch3 := make(chan int, 10)
	ch3 <- 1
	ch3 <- 2
	ch3 <- 3

	close(ch3)
	fmt.Println(<-ch3)
	ch3 <- 4
}

//果不close掉channel是会发生死锁的，原因是当for循环读完channel后会继续尝试读取下一个，
//而由于channel没有写入的协程且没关闭，会一直阻塞形成死锁。

func maikn() {

	ch := make(chan int, 10)
	ch <- 1
	ch <- 2
	ch <- 3

	// 方式1
	go func() {
		time.Sleep(time.Second * 10)
		ch <- 4
	}()

	for v := range ch {
		fmt.Println(v, len(ch))
		// 读取完所有值后，ch的sendq中没有groutine
		if len(ch) == 0 { // 如果现有数据量为0，跳出循环
			break
		}
	}

	close(ch)
	for i := range ch {
		fmt.Println(i)
	}
}
